package com.example.service.impl;

import com.example.common.PageBean;
import com.example.dto.EmpDTO;
import com.example.entity.Emp;
import com.example.entity.EmpExpr;
import com.example.mapper.EmpExprMapper;
import com.example.mapper.EmpMapper;
import com.example.service.EmpService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.example.utils.PasswordEncoder;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 员工管理服务实现类
 *
 * @author 系统开发者
 * @since 1.0.0
 */
@Service
public class EmpServiceImpl implements EmpService {
    
    @Autowired
    private EmpMapper empMapper;
    
    @Autowired
    private EmpExprMapper empExprMapper;
    
    private final PasswordEncoder passwordEncoder = new PasswordEncoder();
    
    /**
     * 分页查询员工信息
     *
     * @param name 员工姓名，支持模糊查询
     * @param deptId 部门ID
     * @param page 当前页码
     * @param pageSize 每页记录数
     * @return 员工信息分页结果
     */
    @Override
    public PageBean<Emp> page(String name, Integer deptId, Integer page, Integer pageSize) {
        // 设置分页参数
        PageHelper.startPage(page, pageSize);
        
        // 执行关联查询
        List<Emp> empList = empMapper.pageWithDept(name, deptId, null, null);
        
        // 获取分页结果
        Page<Emp> p = (Page<Emp>) empList;
        
        // 封装结果
        return new PageBean<>(p.getTotal(), p.getResult());
    }
    
    /**
     * 根据ID查询员工详细信息，包含工作经历
     *
     * @param id 员工ID
     * @return 员工详细信息，未找到时返回null
     */
    @Override
    public Emp getById(Integer id) {
        // 使用关联查询获取员工详情
        Emp emp = empMapper.getEmpDetail(id);
        
        // 如果需要，还可以查询员工的工作经历
        if (emp != null) {
            List<EmpExpr> exprList = empExprMapper.findByEmpId(id);
            emp.setExprList(exprList);
        }
        
        return emp;
    }
    
    /**
     * 新增员工信息
     *
     * @param empDTO 员工数据传输对象
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void save(EmpDTO empDTO) {
        Emp emp = new Emp();
        BeanUtils.copyProperties(empDTO, emp);
        
        // 密码加密
        if (emp.getPassword() != null && !emp.getPassword().isEmpty()) {
            emp.setPassword(passwordEncoder.encode(emp.getPassword()));
        } else {
            // 设置默认密码
            emp.setPassword(passwordEncoder.encode("123456"));
        }
        
        // 设置创建和更新时间
        LocalDateTime now = LocalDateTime.now();
        emp.setCreateTime(now);
        emp.setUpdateTime(now);
        
        empMapper.insert(emp);
    }
    
    /**
     * 更新员工信息
     *
     * @param empDTO 员工数据传输对象
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void update(EmpDTO empDTO) {
        Emp emp = new Emp();
        BeanUtils.copyProperties(empDTO, emp);
        
        // 如果有密码且不为空，则加密
        if (emp.getPassword() != null && !emp.getPassword().isEmpty()) {
            emp.setPassword(passwordEncoder.encode(emp.getPassword()));
        }
        
        // 设置更新时间
        emp.setUpdateTime(LocalDateTime.now());
        
        empMapper.update(emp);
    }
    
    /**
     * 删除员工
     *
     * @param id 员工ID
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delete(Integer id) {
        empMapper.deleteById(id);
    }
    
    /**
     * 查询所有员工
     *
     * @return 员工列表
     */
    @Override
    public List<Emp> list() {
        return empMapper.list(null, null, null, null);
    }
} 